#include "mprpcconfig.h"
#include <fstream>
#include <iostream>
#include <algorithm>

namespace rpc {

void MprpcConfig::LoadConfig(const std::string& config_file) {
    std::ifstream ifs(config_file);
    if (!ifs.is_open()) {
        std::cerr << config_file << " is not exists!" << std::endl;
        exit(EXIT_FAILURE);
    }

    std::string line;   // 存储读取的一行内容
    while (std::getline(ifs, line)) {
        Trim(line);

        // 去除注释和空行
        if (line.empty() || line[0] == '#') {
            continue;
        }

        // 解析键值对（格式：key=value）
        size_t eq_pos = line.find('=');
        if (eq_pos == std::string::npos) {
            std::cerr << "Invalid config format: " << line << " (missing '=')" << std::endl;
            continue;  // 跳过不合法的配置项
        }

        std::string key = line.substr(0, eq_pos);
        Trim(key);
        std::string value = line.substr(eq_pos + 1);
        Trim(value);

        m_config_map[key] = value;  // 覆盖重复的key
    }

    ifs.close();
}

std::string MprpcConfig::Load(const std::string& key) {
    auto it = m_config_map.find(key);
    if (it != m_config_map.end()) {
        return it->second;
    }
    return "";
}

void MprpcConfig::Trim(std::string& str) {
    // 找到第一个非空白字符的位置
    size_t start = str.find_first_not_of(" \t\r\n");
    if (start == std::string::npos) {
        str.clear();
    }
    else {
        str = str.substr(start);  // 截取从第一个非空格开始的子串
    }
    
    // 找到最后一个非空白字符的位置
    size_t end = str.find_last_not_of(" \t\r\n");
    if (end != std::string::npos) {
        str = str.substr(0, end + 1);  // 截取到最后一个非空格（包含该字符）
    } 
    else {
        str.clear();
    }
}

}  // namespace rpc